// Copyright (c) 2017 The Bitcoin Core developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.

#ifndef BITCOIN_RPC_RAWTRANSACTION_UTIL_H
#define BITCOIN_RPC_RAWTRANSACTION_UTIL_H

#include <map>
#include <string>

class FillableSigningProvider;
class CChainParams;

class CMutableTransaction;
class Coin;
class COutPoint;
class SigningProvider;
class UniValue;

/**
 * Sign a transaction with the given keystore and previous transactions
 *
 * @param  mtx           The transaction to-be-signed
 * @param  keystore      Temporary keystore containing signing keys
 * @param  coins         Map of unspent outputs
 * @param  hashType      The signature hash type
 * @param result         JSON object where signed transaction results accumulate
 */
void SignTransaction(CMutableTransaction &mtx, const SigningProvider *keystore,
                     const std::map<COutPoint, Coin> &coins,
                     const UniValue &hashType, UniValue &result);
void SignTransactionResultToJSON(CMutableTransaction &mtx, bool complete,
                                 const std::map<COutPoint, Coin> &coins,
                                 const std::map<int, std::string> &input_errors,
                                 UniValue &result);

/**
 * Parse a prevtxs UniValue array and get the map of coins from it
 *
 * @param  prevTxsUnival Array of previous txns outputs that tx depends on but
 * may not yet be in the block chain
 * @param  keystore      A pointer to the temporary keystore if there is one
 * @param  coins         Map of unspent outputs - coins in mempool and current
 * chain UTXO set, may be extended by previous txns outputs after call
 */
void ParsePrevouts(const UniValue &prevTxsUnival,
                   FillableSigningProvider *keystore,
                   std::map<COutPoint, Coin> &coins);

/** Create a transaction from univalue parameters */
CMutableTransaction ConstructTransaction(const CChainParams &params,
                                         const UniValue &inputs_in,
                                         const UniValue &outputs_in,
                                         const UniValue &locktime);

#endif // BITCOIN_RPC_RAWTRANSACTION_UTIL_H
